package graph;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import back.Archivos;
import back.Juego;


public class WindowGame extends JFrame {
	
	private static final int CELL_SIZE = 30;

	public WindowGame(final Juego juego) {
		super("Socoban - "+juego.verJugador());
	    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	    this.setResizable(true);
	    Toolkit toolkit = getToolkit();
	    Dimension size = toolkit.getScreenSize();
	    this.setLocation(size.width/2 - getWidth()/2, size.height/2 - getHeight()/2);
	    ImprimeTablero2 tab=new ImprimeTablero2(juego);
	    this.setContentPane(tab);
		this.setSize(tab.getWidth(),tab.getHeight());
	    addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                try {
					actualiza(e.getKeyCode(), true);
				} catch (Exception e1){}
            }
            private void actualiza(int keyCode, boolean pressed) throws FileNotFoundException, IOException, CloneNotSupportedException {
                switch (keyCode) {
                    case KeyEvent.VK_UP:
                        juego.hacerMov(2);
                        ImprimeTablero2 tab=new ImprimeTablero2(juego);
                	    setContentPane(tab);
                		setSize(tab.getWidth(),tab.getHeight());
                		if(juego.JuegoTerminado()){
                     		dispose();
                     		String mensaje = "Felicitaciones "+juego.verJugador()+" has completado el juego!!!";
                     		new MensajeFrame(mensaje);
                         }
                        break;

                    case KeyEvent.VK_DOWN:
                    	juego.hacerMov(0);
                        tab=new ImprimeTablero2(juego);
                	    setContentPane(tab);
                		setSize(tab.getWidth(),tab.getHeight());
                		if(juego.JuegoTerminado()){
                     		dispose();
                     		String mensaje = "Felicitaciones "+juego.verJugador()+" has completado el juego!!!";
                     		new MensajeFrame(mensaje);
                         }
                        break;

                    case KeyEvent.VK_LEFT:
                        juego.hacerMov(1);
                        tab=new ImprimeTablero2(juego);
                	    setContentPane(tab);
                		setSize(tab.getWidth(),tab.getHeight());
                		if(juego.JuegoTerminado()){
                     		dispose();
                     		String mensaje = "Felicitaciones "+juego.verJugador()+" has completado el juego!!!";
                     		new MensajeFrame(mensaje);
                         }
                		
                        break;

                    case KeyEvent.VK_RIGHT:
                        juego.hacerMov(3);
                        tab=new ImprimeTablero2(juego);
                	    setContentPane(tab);
                		setSize(tab.getWidth(),tab.getHeight());
                		if(juego.JuegoTerminado()){
                     		dispose();
                     		String mensaje = "Felicitaciones "+juego.verJugador()+" has completado el juego!!!";
                     		new MensajeFrame(mensaje);
                         }
						
                        break;
                }
            }
        });
	    
	    final BoardPanel bp = new BoardPanel(juego.getTablero().getFils(), juego.getTablero().getCols(), CELL_SIZE);
		bp.setBackground(Color.WHITE);
		add(bp);
	    
	    JMenuBar menubar = new JMenuBar();
		  JMenu file = new JMenu("Juego");
	      file.setMnemonic(KeyEvent.VK_J);
	      JMenuItem newGame = new JMenuItem("Nuevo juego");
	      newGame.addActionListener(new ActionListener() {
		    	@Override
		    	public void actionPerformed(ActionEvent e) {
		    		setVisible(false);
		    		new NuevoJuego();
		    	}
		      });
		      
	      JMenuItem loadGame = new JMenuItem("Cargar juego guardado");
	      loadGame.addActionListener(new ActionListener() {
		    	@Override
		    	public void actionPerformed(ActionEvent e) {
		    		JFileChooser selector=new JFileChooser("./guardados");
					selector.showOpenDialog(bp);
					File archivo=selector.getSelectedFile();
					if(archivo != null){
					try {
		    			File[] niveles;
						niveles = Archivos.cargarNiveles();
						Juego juego= new Juego(niveles);
						Archivos.cargaJuego(juego, archivo);
						WindowGame game=new WindowGame(juego);
						game.setVisible(true);
						setVisible(false);
					} catch (Exception e1) {
						String mensaje = "Problemas al cargar el archivo";
						new MensajeFrame(mensaje);
						}
					}
		    	}
		      });
		      
	      JMenuItem saveGame = new JMenuItem("Guardar juego");
	      saveGame.addActionListener(new ActionListener() {
		    	@Override
		    	public void actionPerformed(ActionEvent e) {
		    		JFileChooser selector = new JFileChooser("./guardados");
					selector.setApproveButtonText("Save");
					selector.showSaveDialog(bp);
					File archivo = selector.getSelectedFile();
					String mensaje=null;
					try {
						if(archivo != null) {
							String directorio=archivo.getParentFile().getName();
							if(directorio.equals("levels")) {
								mensaje="Guarde las partidas en el otro directorio.";
								throw new IllegalAccessException();
							}
							Archivos.guardarArchivo(juego, archivo);
						}
					} catch (Exception e1) {
						if( mensaje == null)
							mensaje = "Problemas al guardar el archivo.";
						new MensajeFrame(mensaje);
					}
				}
			});

		      
	      saveGame.setMnemonic(KeyEvent.VK_G);
	      JMenuItem scores = new JMenuItem("Ver mejores puntajes");
	      scores.addActionListener(new ActionListener() {
		    	@Override
		    	public void actionPerformed(ActionEvent e) {
		    		JFrame window = new MenuMostrarPuntajes();
					window.setVisible(true);
					}
		    	}
		      );
		      
	      
	      file.add(newGame);
	      file.add(loadGame);
	      file.add(saveGame);
	      file.add(scores);
	      JMenu level=new JMenu("Nivel");
	      file.setMnemonic(KeyEvent.VK_N);
	      
	      JMenuItem restartLevel = new JMenuItem("Reiniciar nivel");
	      restartLevel.addActionListener(new ActionListener() {
		    	@Override
		    	public void actionPerformed(ActionEvent e) {
		    		try {
						juego.reiniciarNivel();
						WindowGame game=new WindowGame(juego);
						game.setVisible(true);
						setVisible(false);
					} catch (Exception e1) {}
						
		    	}
		      });
	      level.add(restartLevel);
	      menubar.add(file);
	      menubar.add(level);
	      setJMenuBar(menubar);
	}

}
